home *** CD-ROM | disk | FTP | other *** search
- *************************************************
- * Programmname: FReset (von A.Schranz) *
- * *
- * Funktion: schneller Reset bei A1200 *
- * *
- * Sprache: Assembler (DEVPAC 2.14D) *
- *************************************************
-
- INCDIR INCLUDE/
- INCLUDE EXEC/EXECBASE.I
- INCLUDE EXEC/EXEC_LIB.I
- INCLUDE EXEC/RESIDENT.I
- INCLUDE HARDWARE/CUSTOM.I
- INCLUDE LIBRARIES/DOSEXTENS.I
-
- IFND DMA
- DMA EQU $DFF000
- ENDC
-
- Section S,CODE
- S MOVE.L $4.W,A6
- MOVE.L ThisTask(A6),A3
- MOVEQ #0,D0
- TST.L pr_CLI(A3)
- BNE.S .CLI
- LEA pr_MsgPort(A3),A0
- JSR _LVOWaitPort(A6)
- LEA pr_MsgPort(A3),A0
- JSR _LVOGetMsg(A6)
- .CLI MOVE.L D0,-(SP)
- LEA S-4(PC),A2 ;Ist es der erste Programm-
- MOVE.L (A2),D0 ;aufruf, so wird das
- ADDQ.L #1,D0 ;zweite Segment von ersten
- ADD.L D0,D0 ;getrennt.
- ADD.L D0,D0 ;deshalb sollte A2 vor denn
- MOVE.L D0,-(SP) ;Programmpunkt .1ST in (INIT)
- RTS ;nicht geändert werden.
-
- ;---------------------------------------------> INIT.routine
- Section InitRes,CODE_C
- INIT LEA RES_NAME(PC),A1 ;testen ob wir schon
- JSR _LVOFindResident(A6) ;resident sind
- TST.L D0
- BEQ.S .G0
- .WB_CHECK MOVE.L (SP)+,D0
- BEQ.S .NO_WB
- MOVE.L D0,A1
- JSR _LVOReplyMsg(A6)
- MOVEQ #0,D0 ;ja
- .NO_WB RTS
- .G0 MOVE.L KickTagPtr(A6),D0 ;falls noch kein Reset
- BEQ.S .1ST ;durchgeführt wurde,
- .NEXT_LIST MOVE.L D0,A0 ;testen ob wir in einer der
- .L0 MOVE.L (A0)+,D0 ;KickTagPointers stehen
- BEQ.S .1ST ;wenn 0 dann letzter eintrag
- BPL.S .SEARCH ;falls negativ, handelt
- BCLR #31,D0 ;es sich um einen Zeiger
- BRA.S .NEXT_LIST ;auf die nächste Liste
- .SEARCH LEA RES_NAME(PC),A1 ;ist es unsere ResidentStruktur?
- MOVE.L D0,A3
- MOVE.L RT_NAME(A3),A3
- .L1 CMPM.B (A1)+,(A3)+
- BNE.S .L0
- TST.B -1(A3)
- BNE.S .L1
- BRA.S .WB_CHECK ;ja !
- .1ST MOVE.L D0,(A2) ;Sind noch nicht im System
- LEA KICKTAG_TABLE(PC),A0 ;(aber jetzt !!!)
- LEA RES_MEM_LIST(PC),A1
- MOVE.L KickTagPtr(A6),4(A0) ;falls schon eine Liste
- BEQ.S .NO_KICKTAG ;vorhanden dann mit vorzeichen
- OR.B #$80,4(A0) ;in unser eintragen.
- .NO_KICKTAG MOVE.L A0,KickTagPtr(A6)
- MOVE.L KickMemPtr(A6),D0 ;da wir unser Programm nicht
- BEQ.S .1ST_KICKMEM ;bei jedem Reset allokieren
- MOVE.L D0,LN_SUCC(A1) ;wollen, tragen wir die
- MOVE.L D0,A0 ;MemoryNode in den KickMemPtr
- MOVE.L A1,LN_PRED(A0) ;ein.
- .1ST_KICKMEM MOVE.L A1,KickMemPtr(A6) ;zum schluß noch die
- JSR _LVOSumKickData(A6) ;KickData Checksumme berechnen
- MOVE.L D0,KickCheckSum(A6) ;und eintragen
- BRA.S .WB_CHECK
-
- ;---------------------------------------------> RESIDENT.routine
- REM_SCSI MOVEM.L D1-2/A0-2/A6,-(SP)
- LEA SCSI_N(PC),A1
- MOVE.L $4.W,A6
- JSR _LVOFindResident(A6)
- TST.L D0
- BEQ.S .ERROR
- MOVE.L ResModules(A6),A0
- .L0 MOVE.L (A0)+,D1
- BEQ.S .ERROR
- BPL.S .G0
- BCLR #31,D1
- MOVE.L D1,A0
- BRA.S .L0
- .G0 CMP.L D0,D1
- BNE.S .L0
- MOVE.L D0,A2
- LEA NEW_SCSI(PC),A1
- MOVE.B RT_PRI(A2),RT_PRI(A1)
- MOVE.L A2,RT_SIZE(A1)
- MOVE.L A1,-4(A0)
- MOVEM.L (SP)+,D1-2/A0-2/A6
- MOVEQ #0,D0
- RTS
- .ERROR MOVEQ #-1,D0
- MOVEQ #9,D2
- LEA DMA,A5
- .L1 MOVE.W vhposr(A5),D1
- AND.W #$F33,D1
- MOVE.W D1,$180(A5)
- DBF D0,.L1
- DBF D2,.L1
- MOVEM.L (SP)+,D1-2/A0-2/A6
- RTS
-
- REPARE LEA NEW_SCSI(PC),A0
- MOVE.L $4.W,A6
- MOVE.L ResModules(A6),A1
- .L0 MOVE.L (A1)+,D0
- BEQ.S .FIN
- BPL.S .CHECK
- BCLR #31,D0
- MOVE.L D0,A1
- BRA.S .L0
- .CHECK CMP.L D0,A0
- BNE.S .L0
- MOVE.L RT_SIZE(A0),-4(A1)
- .FIN RTS
- ;---------------------------------------------> DATAFIELD's
- CNOP 0,4
- NEW_SCSI DC.W RTC_MATCHWORD
- DC.L NEW_SCSI,RES_END
- DC.B 1,1,0,0
- DC.L SCSI_N
- DC.L SCSI_N
- DC.L REPARE
- DS.L 1 ;hier wird die Original
- CNOP 0,4 ;ResidentStruktur gerettet
- RES_STRUCT DC.W RTC_MATCHWORD
- DC.L RES_STRUCT,RES_END ;ab ResEnd weiter suchen !
- DC.B 1 ;RT_FLAGS
- DC.B 1 ;RT_VERSION
- DC.B 0 ;RT_TYPE
- DC.B 104 ;RT_PRI
- DC.L RES_NAME ;RT_NAME
- DC.L RES_NAME ;RT_IDSTRING
- DC.L REM_SCSI ;RT_INIT
- CNOP 0,4
- KICKTAG_TABLE DC.L RES_STRUCT
- DS.L 1
- RES_MEM_LIST DS.L 2
- DC.B NT_MEMORY,0
- DC.L RES_NAME
- DC.W 1
- DC.L REM_SCSI,RES_END-REM_SCSI
- RES_NAME DC.B 'FReset',0
- SCSI_N DC.B 'scsi.device',0
- EVEN
- RES_END
-
-
-